package com.cencat.driver.config;

import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import jakarta.servlet.http.HttpServletRequest;
import java.util.Arrays;
import java.util.List;

/**
 * 司机端系统多租户处理器
 * 实现数据隔离，确保不同租户的数据互不干扰
 * 
 * @author cencat
 * @since 2024-01-01
 */
public class DriverTenantLineHandler implements TenantLineHandler {

    /**
     * 租户字段名
     */
    private static final String TENANT_ID_COLUMN = "tenant_id";

    /**
     * 需要忽略多租户的表名列表
     */
    private static final List<String> IGNORE_TABLES = Arrays.asList(
        "sys_tenant",
        "sys_user",
        "sys_role",
        "sys_permission",
        "sys_config",
        "sys_dict",
        "sys_log"
    );

    /**
     * 获取租户ID
     * 从请求头或请求参数中获取租户ID
     * 
     * @return 租户ID表达式
     */
    @Override
    public Expression getTenantId() {
        Long tenantId = getCurrentTenantId();
        if (tenantId != null) {
            return new LongValue(tenantId);
        }
        // 默认租户ID为1
        return new LongValue(1L);
    }

    /**
     * 获取租户字段名
     * 
     * @return 租户字段名
     */
    @Override
    public String getTenantIdColumn() {
        return TENANT_ID_COLUMN;
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     * 
     * @param tableName 表名
     * @return 是否忽略
     */
    @Override
    public boolean ignoreTable(String tableName) {
        return IGNORE_TABLES.contains(tableName.toLowerCase());
    }

    /**
     * 从当前请求中获取租户ID
     * 
     * @return 租户ID
     */
    private Long getCurrentTenantId() {
        try {
            ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
            if (attributes != null) {
                HttpServletRequest request = attributes.getRequest();
                
                // 优先从请求头获取
                String tenantIdHeader = request.getHeader("X-Tenant-Id");
                if (tenantIdHeader != null && !tenantIdHeader.isEmpty()) {
                    return Long.parseLong(tenantIdHeader);
                }
                
                // 从请求参数获取
                String tenantIdParam = request.getParameter("tenantId");
                if (tenantIdParam != null && !tenantIdParam.isEmpty()) {
                    return Long.parseLong(tenantIdParam);
                }
                
                // 从JWT Token中获取（如果有的话）
                String token = request.getHeader("Authorization");
                if (token != null && token.startsWith("Bearer ")) {
                    // 这里可以解析JWT获取租户ID
                    // 暂时返回null，由具体的JWT工具类实现
                }
            }
        } catch (Exception e) {
            // 忽略异常，返回默认值
        }
        
        return null;
    }
}